package com.bookocean.domain.repository;

/**
 * 书摘点赞仓储接口
 * 
 * @author BookOcean
 * @since 2024-01-01
 */
public interface BookLikeRepository {


    /**
     * 检查用户是否已点赞
     * 
     * @param quoteId 书摘ID
     * @param userId 用户ID
     * @return 是否已点赞
     */
    boolean existsByQuoteIdAndUserId(Long quoteId, Long userId);

    /**
     * 获取书摘点赞数量
     * 
     * @param quoteId 书摘ID
     * @return 点赞数量
     */
    Integer getLikeCount(Long quoteId);

    // ========== 通用互动方法（支持书摘、小说、章节） ==========

    /**
     * 点赞（通用方法）
     * 
     * @param targetId 目标ID
     * @param targetType 目标类型（1-书摘，2-小说，3-章节）
     * @param userId 用户ID
     */
    void like(Long targetId, Integer targetType, Long userId);

    /**
     * 取消点赞（通用方法）
     * 
     * @param targetId 目标ID
     * @param targetType 目标类型（1-书摘，2-小说，3-章节）
     * @param userId 用户ID
     */
    void unlike(Long targetId, Integer targetType, Long userId);

    /**
     * 检查用户是否已点赞（通用方法）
     * 
     * @param targetId 目标ID
     * @param targetType 目标类型（1-书摘，2-小说，3-章节）
     * @param userId 用户ID
     * @return 是否已点赞
     */
    boolean isLikedByUser(Long targetId, Integer targetType, Long userId);

    /**
     * 获取目标点赞数量（通用方法）
     * 
     * @param targetId 目标ID
     * @param targetType 目标类型（1-书摘，2-小说，3-章节）
     * @return 点赞数量
     */
    Integer countByTarget(Long targetId, Integer targetType);
}
